#ifndef _FLASH_API_H_
#define _FLASH_API_H_

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

/**
 * @brief 获取升级程序固件总大小
 *
 * @return uint32_t - 总大小
 */
extern uint32_t FlashGetBootloaderFirmwareMaxFileSize(void);

/**
 * @brief 删除升级程序固件文件
 *
 */
extern void FlashDeleteBootloaderFirmwareFile(void);

/**
 * @brief 读取升级程序固件文件
 *
 * @param ReadAddrOffset - 读取地址偏移
 * @param pFileOut       - 输出目标地址数据
 * @param FileSize       - 读取数据长度
 */
extern void FlashReadBootloaderFirmwareFile(uint32_t ReadAddrOffset, void *pFileOut, uint32_t FileSize);

/**
 * @brief 写入升级程序固件文件
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool FlashWriteBootloaderFirmwareFile(uint32_t WriteAddrOffset, const void *pFileIn, uint32_t FileSize);

/**
 * @brief 获取应用程序固件总大小
 *
 * @return uint32_t - 总大小
 */
extern uint32_t FlashGetApplictionFirmwareFileMaxSize(void);

/**
 * @brief 删除所有应用程序固件文件
 *
 */
extern void FlashDeleteApplictionFirmwareFile(void);

/**
 * @brief 读取应用程序固件文件
 *
 * @param ReadAddrOffset - 读取地址偏移
 * @param pFileOut       - 输出目标地址数据
 * @param FileSize       - 读取数据长度
 */
extern void FlashReadApplictionFirmwareFile(uint32_t ReadAddrOffset, void *pFileOut, uint32_t FileSize);

/**
 * @brief 写入应用程序固件文件
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool FlashWriteApplicationFirmwareFile(uint32_t WriteAddrOffset, const void *pFileIn, uint32_t FileSize);

/**
 * @brief 获取备份程序固件文件总大小
 *
 * @return uint32_t - 总大小
 */
extern uint32_t FlashGetBackupBootloaderFirmwareFileSize(void);

/**
 * @brief 删除备份程序固件文件
 *
 */
extern void FlashDeleteBackupBootloaderFirmwareFile(void);

/**
 * @brief 读取备份程序固件文件
 *
 * @param ReadAddrOffset - 读取地址偏移
 * @param pFileOut       - 输出目标地址数据
 * @param FileSize       - 读取数据长度
 * @return bool           - 读取状态（true：成功 false：失败）
 */
extern void FlashReadBackupBootloaderFirmwareFile(uint32_t ReadAddrOffset, void *pFileOut, uint32_t FileSize);

/**
 * @brief 写入备份程序固件文件
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool FlashWriteBackupBootloaderFirmwareFile(uint32_t WriteAddrOffset, const void *pFileIn, uint32_t FileSize);

/**
 * @brief 计算备份固件的校验码
 *
 * @param UpdateDataSize - 待更新数据的大小
 * @return uint32_t      - 计算得到的校验码
 */
extern uint32_t FlashGetBackupBootloaderFirmwareCheckCode(uint32_t UpdateDataSize);

/**
 * @brief 更新引导程序
 *
 * @return bool - 更新状态（true：成功 false：失败）
 */
extern bool FlashUpdateBootloaderFirmware(void);

/**
 * @brief 获取设备参数文件总大小
 *
 */
extern uint32_t FlashGetDeviceParameterMaxFileSize(void);

/**
 * @brief 删除设备参数文件
 *
 */
extern void FlashDeleteDeviceParameterFile(void);

/**
 * @brief 读取设备参数文件
 *
 * @param ReadAddrOffset - 读取地址偏移
 * @param pFileOut       - 输出目标地址数据
 * @param FileSize       - 读取数据长度
 */
extern void FlashReadDeviceParameterFile(uint32_t ReadAddrOffset, void *pFileOut, uint32_t FileSize);

/**
 * @brief 写入设备参数文件
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool FlashWriteDeviceParameterFile(uint32_t WriteAddrOffset, const void *pFileIn, uint32_t FileSize);

/**
 * @brief 获取持卡人文件总大小
 *
 */
extern uint32_t FlashGetCardHolderMaxFileSize(void);

/**
 * @brief 删除持卡人文件总大小
 *
 */
extern void FlashDeleteCardHolderFile(void);

/**
 * @brief 读取持卡人文件
 *
 * @param ReadAddrOffset - 读取地址偏移
 * @param pFileOut       - 输出目标地址数据
 * @param FileSize       - 读取数据长度
 */
extern void FlashReadCardHolderFile(uint32_t ReadAddrOffset, void *pFileOut, uint32_t FileSize);

/**
 * @brief 写入持卡人文件
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool FlashWriteCardHolderFile(uint32_t WriteAddrOffset, const void *pFileIn, uint32_t FileSize);

/**
 * @brief 获取日志文件总大小
 *
 */
extern uint32_t FlashGetLogMaxFileSize(void);

/**
 * @brief 删除日志文件
 *
 */
extern void FlashDeleteLogFile(void);

/**
 * @brief 读取日志文件
 *
 * @param ReadAddrOffset - 读取地址偏移
 * @param pFileOut       - 输出目标地址数据
 * @param FileSize       - 读取数据长度
 */
extern void FlashReadLogFile(uint32_t ReadAddrOffset, void *pFileOut, uint32_t FileSize);

/**
 * @brief 写入日志文件
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool FlashWriteLogFile(uint32_t WriteAddrOffset, const void *pFileIn, uint32_t FileSize);

/**
 * @brief 获取临时文件文件大小
 *
 * @return uint32_t - 文件大小
 */
extern uint32_t FlashGetTemporaryFileMaxFileSize(void);

/**
 * @brief 删除临时文件
 *
 */
extern void FlashDeleteTemporaryFile(void);

/**
 * @brief 读取临时文件
 *
 * @param ReadAddrOffset - 读取地址偏移
 * @param pFileOut       - 输出目标地址数据
 * @param FileSize       - 读取数据长度
 */
extern void FlashReadTemporaryFile(uint32_t ReadAddrOffset, void *pFileOut, uint32_t FileSize);

/**
 * @brief 写入临时文件
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool FlashWriteTemporaryFile(uint32_t WriteAddrOffset, const void *pFileIn, uint32_t FileSize);



/*** io板固件区flash读写api ***/
/**
 * @brief 获取io板固件文件大小
 *
 * @return uint32_t - 文件大小
 */
extern uint32_t FlashGetIoBoardFirmwareMaxFileSize(void);

/**
 * @brief 删除io板固件
 *
 */
extern void FlashDeleteIoBoardFirmware(void);

/**
 * @brief 读取io板固件
 *
 * @param ReadAddrOffset - 读取地址偏移
 * @param pFileOut       - 输出目标地址数据
 * @param FileSize       - 读取数据长度
 */
extern void FlashReadIoBoardFirmware(uint32_t ReadAddrOffset, void *pFileOut, uint32_t FileSize);

/**
 * @brief 写入io板固件
 *
 * @param WriteAddrOffset - 写入地址偏移
 * @param pFileIn         - 指向待写入数据地址的指针变量
 * @param FileSize        - 写入数据文件长度
 * @return bool           - 写入状态（true：成功 false：失败）
 */
extern bool FlashWriteIoBoardFirmware(uint32_t WriteAddrOffset, const void *pFileIn, uint32_t FileSize);

/*** io板固件区flash读写api 结束 ***/

#endif
